#ifndef TAREFA_TAREFA_H
#define TAREFA_TAREFA_H

namespace teclado { class teclado; }

namespace tarefa {

/**
* \brief Uma tarefa.
*
* Executa um trabalho, pode ser qualquer coisa.
*
* @author Daniel Fleischman
* @date 29/01/2008
*/
class tarefa {
  public:
  /**
    * Construtor.
    * @param deleta determina se a tarefa deve ser destruida
    * automaticamente pelo gerenciador de tarefas quando este
    * eh destruido, ou quando a tarefa "avisa" que terminou.
    */
  tarefa(bool deleta = false);
  virtual ~tarefa() {};
  /**
    * Funcao que define o trabalho que esta tarefa executa.
    * Funcao puramente virtual, deve ser sobrecarregada pelos
    * filhos.
    * @param passou quantos ms passaram no ultimo loop do
    * gerenciador
    * @return false se a tarefa deve ser tirada da lista do
    * gerenciador
    */
  virtual bool executa(int passou) = 0;
  protected:
  /**
    * Flag que diz se a tarefa esta dormindo ou nao.
    * Caso esteja dormindo, o gerenciador de tarefas nao a
    * executa.
    */
  bool dormindo;
  bool deleta_;
  friend class gerenciador;
  friend class teclado::teclado;
};
}

#endif
